package Modele;

/**
 * Classe permettant de gérer le damier
 * @author El Meknassi Hamza (10806466) - Migeon Cyril (11007322)
 */
public class Damier {
     private Case plateau[][] = new Case [10][10];
     private FabriquePiece pF = new FabriquePiece();

    /**
     * Constructeur de Damier
     * On construit simplement le damier
     */
    public Damier (){
        for (int y=0; y<10; y++)
        {
            for (int x=0; x<10;x++)
            {
                if ((x+y) %2 == 1)
                    plateau[x][y] = new Case(0, x, y);
                else
                    plateau[x][y] = new Case(x, y);
            }
        }
    }
    
    /**
    *  Appelée pour placer les pièces sur le damier quand on commence une partie
    */
    public void placerPieces(){
        for(int y=0; y<10; y++)
        {
            for(int x=0; x<10; x++)
            {
                if(((x+y)%2==1) && y<4)
                {
                    this.plateau[x][y].setPiece(pF.creerPiece("pion", 'n'));
                    this.plateau[x][y].setEtat(1);
                }
                else if(((x+y)%2==1) && y>5)
                {
                    this.plateau[x][y].setPiece(pF.creerPiece("pion", 'b'));
                    this.plateau[x][y].setEtat(1);
                }
            }
        }
    }
    
    /**
     * Retourne la case correspondant aux coordonnées passées en argument
     * @param x ordonnée de la case
     * @param y abcisse de la case
     * @return la case souhaitée
     */
    public Case getCase(int x, int y){
        return this.plateau[x][y];
    }
    
    /**
     * Retourne la case correspondant aux coordonnées passées en argument
     * @param position contient les coordonnées de la case
     * @return la case souhaitée
     */
    public Case getCase(Position position){
        int x = position.getX();
        int y = position.getY();
        
        return this.plateau[x][y];
    }

    /**
     * Renvoie la couleur de la pièce présente sur la case donnée en paramètre
     * @param x
     * @param y
     * @return couleur de la pièce
     */
    public char getCouleurPiece (int x, int y)
    {
        return this.plateau[x][y].getPiece().getCouleur();
    }

    /**
     * Permet d'obtenir l'état de la case donnée en paramètre
     * @param x
     * @param y
     * @return l'état de la case
     */
    public int getEtatCase (int x, int y)
    {
        return this.plateau[x][y].getEtat();
    }
    
    /**
     * Retourne le nombre de pièces blanches sur le damier
     * @return nbPiecesBlanches nombre de pièces blanches sur le damier
     */
    public int getNbPiecesBlanches(){
        int nbPiecesBlanches = 0;
        
        for (int y=0; y<10; y++)
        {
            for (int x=0; x<10;x++)
            {
                Case maCase = this.plateau[x][y];
                
                if(maCase.getEtat() == 1)
                {
                    char couleurPiece = maCase.getPiece().getCouleur();
                    if(couleurPiece == 'b')
                        nbPiecesBlanches++;
                }
            }
        }
        
        return nbPiecesBlanches;
    }

    /**
     * Retourne le nombre de pièces noires sur le damier
     * @return nbPiecesNoires nombre de pièces noires sur le damier
     */
    public int getNbPiecesNoires(){
        int nbPiecesNoires = 0;
        
        for (int y=0; y<10; y++)
        {
            for (int x=0; x<10;x++)
            {
                Case maCase = this.plateau[x][y];
                
                if(maCase.getEtat() == 1)
                {
                    char couleurPiece = maCase.getPiece().getCouleur();
                    if(couleurPiece == 'n')
                        nbPiecesNoires++;
                }
            }
        }
        
        return nbPiecesNoires;
    }
    
    /**
     * Transforme les pions noirs en dames noires si besoin
     */
    public void getNewDamesNoires(){
        for(int x = 0; x < 10; x++)
        {
            Case maCase = this.plateau[x][9];
            if(maCase.getEtat() == 1)
            {
                Piece piece = maCase.getPiece();
                char couleurPiece = piece.getCouleur();
                if(couleurPiece == 'n')
                {
                    if(!(piece instanceof Dame))
                    {
                        Dame dame = (Dame)pF.creerPiece("dame", couleurPiece);
                        maCase.setPiece(dame);
                    }
                }
            }
        }
    }
    
    /**
     * Transforme les pions blancs en dames blanches si besoin
     */
    public void getNewDamesBlanches(){
        for(int x = 0; x < 10; x++)
        {
            Case maCase = this.plateau[x][0];
            if(maCase.getEtat() == 1)
            {
                Piece piece = maCase.getPiece();
                char couleurPiece = piece.getCouleur();
                if(couleurPiece == 'b')
                {
                    if(!(piece instanceof Dame))
                    {
                        Dame dame = (Dame)pF.creerPiece("dame", couleurPiece);
                        maCase.setPiece(dame);
                    }
                }
            }
        }
    }

    /**
     * Détermine s'il y a une dame sur la case donnée en paramètre (ses coordonnées)
     * @param x coordonnée x
     * @param y coordonnée y
     * @return vrai si dame, faux sinon
     */
    public boolean isDame(int x, int y)
    {
        boolean booleen = false;
        if ( this.getCase(x, y).getPiece() instanceof Dame)
            booleen = true;
        return booleen;
    }
}